package response

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

var RES = new(Res)

type Res struct{}

// response/response.go
type JSONOptions struct {
	Data any    // 响应数据（可选）
	Msg  string // 错误信息（可选）
}

// response/response.go
type JSONOption func(*JSONOptions)

// 提供默认选项函数，供调用方选择
// 示例：设置响应数据
func WithData(data any) JSONOption {
	return func(opt *JSONOptions) {
		opt.Data = data
	}
}

// 示例：设置日志信息
func WithMsg(msg string) JSONOption {
	return func(opt *JSONOptions) {
		opt.Msg = msg
	}
}

// 统一返回 JSON 数据，默认系统响应200，业务代码和数据自定义
func (res *Res) JSON(ctx *gin.Context, serviceCode int, opts ...JSONOption) {
	// 初始化可选参数的默认值
	options := &JSONOptions{
		Data: "NULL", // 默认无数据
		Msg:  "",     // 默认无错误信息
	}

	// 应用所有选项函数，覆盖默认值
	for _, opt := range opts {
		opt(options)
	}

	// c.Header("", "") // 根据需要在头部添加其他信息
	resmsg := GetResMsg(serviceCode)
	logmsg := GetLogMsg(serviceCode)

	// 存储日志数据到上下文
	ctx.Set("log_msg", logmsg+" "+options.Msg)
	ctx.Set("service_code", serviceCode)

	ctx.JSON(http.StatusOK, Response[any]{
		Code:    serviceCode,
		Message: resmsg,
		Data:    options.Data,
	})
}
